package com.gitee.feizns.quickstart.domain.page;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * 分页请求参数对象模型
 * <p>
 *     用于接受分页数据
 * </p>
 * @author feizns
 * @since 2022/09/19
 */
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class PageAo extends LimitAo {

    /**
     * 设置目标目标页（默认1）
     */
    private Long current = PageVo.DEFAULT_CURRENT;

    /**
     * 设置页大小（默认10）
     */
    private Long size = PageVo.DEFAULT_SIZE;

    /**
     * 允许设置 limit 为 -1 时查询全部数据
     * @param limit 数据上限
     */
    public void setLimit(Long limit) {
        super.setLimit(limit);
        //同步到分页大小
        this.setSize(getLimit());
    }

    /**
     * 得到当前页（如果查询全部数据则重置到第一页）
     * @return {@link Long}
     */
    public Long getCurrent() {
        return (size == PageVo.LARGEST_PAGE_SIZE) ? PageVo.DEFAULT_CURRENT : (current == null ? PageVo.DEFAULT_CURRENT : current);
    }

    /**
     * 获取大小
     * @return {@link Long}
     */
    public Long getSize() {
        return size == null ? PageVo.DEFAULT_SIZE : size;
    }

    public PageAo(Long current, Long size) {
        this.current = current;
        this.size = size;
    }

    public PageAo(Long size) {
        this.size = size;
    }

    /**
     * 静态创建{@link PageAo}
     * @param current 当前页
     * @param size 页大小
     * @return {@link PageAo}
     */
    public static PageAo of(long current, long size) {
        return new PageAo(current, size);
    }

    /**
     * 空参数（默认分页请求参数）
     * @return {@link PageAo}
     */
    public static PageAo empty() {
        return new PageAo();
    }

    /**
     * 最大参数
     * @return {@link PageAo}
     */
    public static PageAo maximum() {
        return new PageAo(PageVo.DEFAULT_CURRENT, PageVo.LARGEST_PAGE_SIZE);
    }

}
